package perms

import (
	"github.com/gin-gonic/gin"
	"net/http"
	"ruoyi-go/utils/R"
	"strings"
)

/*
*
自动生成接口权限码并校验(权限码根据接口路径自动生成，需配置的接口权限码与路径一致)
*/
func AutoGenCheck(e *gin.Context) {
	// 未手动申明权限码，自动按接口路径生成
	checkPerms := generateCurPerms(e)

	// 角色判断是否超管，不是则校验权限码
	checkRoleOrPerms(checkPerms, e)
}

/*
*
手动声明接口权限码并校验
*/
func Check(checkPerms string) gin.HandlerFunc {
	return func(e *gin.Context) {
		// 角色判断是否超管，不是则校验权限码
		checkRoleOrPerms(checkPerms, e)
	}
}

/*
*
角色与权限校验函数
*/
func checkRoleOrPerms(checkPerms string, e *gin.Context) {
	// 角色判断：是否超管
	roleKey, roleExists := e.Get("roleKey")
	if roleExists {
		roleKeySlice, ok := roleKey.([]interface{})
		if ok {
			for _, v := range roleKeySlice {
				if v == "admin" {
					return
				}
			}
		}
	}

	// 权限码判断：非超管判断权限码
	permissionCode, exists := e.Get("permissionCode")
	if !exists {
		e.JSON(http.StatusOK, R.ReturnFailMsg("没有权限"))
		e.Abort()
		return
	}
	permsSlice, ok := permissionCode.([]interface{})
	if ok {
		for _, v := range permsSlice {
			if v == checkPerms {
				return
			}
		}
	}

	e.JSON(http.StatusOK, R.ReturnFailMsg("没有权限"))
	e.Abort()
	return
}

/*
*
根据接口路劲自动生成权限码
*/
func generateCurPerms(e *gin.Context) string {
	// 获取接口路径
	path := e.FullPath()
	// 路径处理成权限码
	return strings.ReplaceAll(strings.TrimPrefix(path, "/"), "/", ":")
}
